<!DOCTYPE HTML>
<html>
<head>
<title>GUI | AutoHotkey</title>
<meta name="description" content="The Gui command creates and manages windows and controls. Such windows can be used as data entry forms or custom user interfaces." />
<meta name="ahk:equiv-v2" content="objects/Gui.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>GUI</h1>

<p>创建和管理窗口和控件. 这种窗口可以用作数据输入窗体或自定义用户界面.</p>
<pre class="Syntax"><span class="func">Gui</span>, <a href="#SubCommands">SubCommand</a> <span class="optional">, Value1, Value2, Value3</span></pre>
<p><em>SubCommand</em>, <em>Value1</em>, <em>Value2</em> 和 <em>Value3</em> 相互依赖, 它们的用法如下所述.</p>

<h2 id="toc">目录</h2>
<ul>
    <li><a href="#SubCommands">子命令</a></li>
    <li><a href="#ControlOptions">控件的选项(Gui Add)</a><ul>
      <li><a href="#PosSize">控件的位置和大小</a></li>
      <li><a href="#Events">保存和响应用户的输入</a></li>
      <li><a href="#OtherOptions">控件: 通用样式和其他选项</a></li>
    </ul></li>
    <li><a href="#Labels">窗口事件</a>: <a href="#GuiClose">GuiClose</a> | <a href="#GuiEscape">GuiEscape</a> | <a href="#GuiSize">GuiSize</a> | <a href="#GuiContextMenu">GuiContextMenu</a> | <a href="#GuiDropFiles">GuiDropFiles</a></li>
    <li><a href="#MultiWin">创建多个 GUI 窗口</a></li>
   <li><a href="#DefaultWin">GUI 事件, 线程和子程序</a></li>
    <li><a href="#Navigate">键盘导航</a></li>
    <li><a href="#Appear">窗口外观</a></li>
    <li><a href="#GenRemarks">一般说明</a></li>
    <li><a href="#Examples">示例</a></li>
</ul>

<h2 id="SubCommands">子命令</h2>
<p>对于 <em>SubCommand</em>, 指定以下命令之一:</p>
<ul>
  <li><a href="#New">New</a> <span class="ver">[v1.1.04+]</span>: 创建新窗口.</li>
  <li><a href="#Add">Add</a>: 创建控件, 例如文本, 按钮或复选框.</li>
  <li><a href="#Show">Show</a>: 显示窗口. 同时可以最小化, 最大化和移动窗口.</li>
  <li><a href="#Submit">Submit</a>: 保存用户的输入并可以隐藏窗口.</li>
  <li><a href="#Cancel">Cancel</a>(或 Hide): 隐藏窗口.</li>
  <li><a href="#Destroy">Destroy</a>: 销毁窗口.</li>
  <li><a href="#Font">Font</a>: 为后续创建的控件文本设置文字的字体, 大小, 样式和文本颜色.</li>
  <li><a href="#Color">Color</a>: 设置窗口和/或控件的背景颜色.</li>
  <li><a href="#Margin">Margin</a>: 设置在没有为控件指定明确的位置时使用的边距/间隔.</li>
  <li><a href="#Options">窗口的选项和样式</a>: 设置窗口的外观和行为的各种选项.</li>
  <li><a href="#Menu">Menu</a>: 添加或移除菜单栏.</li>
  <li><a href="#Minimize">Minimize / Maximize / Restore</a>: 对窗口执行指定的操作.</li>
  <li><a href="#Flash">Flash</a>: 闪烁窗口及其任务栏按钮.</li>
  <li><a href="#Default">Default</a>: 改变当前线程的默认 GUI 窗口编号.</li>
</ul>

<h3 id="New">New <span class="ver">[v1.1.04+]</span></h3>
<p>创建新窗口并将其设为当前线程的<a href="#Default">默认窗口</a>.</p>
<pre class="Syntax"><span class="func">Gui</span>, New <span class="optional">, Options, Title</span>
<span class="func">Gui</span>, GuiName:New <span class="optional">, Options, Title</span></pre>
<p>如果指定了 <em>GuiName</em>, 那么将创建一个新的 GUI, 销毁任何具有该名称的现有 GUI. 否则, 将创建一个新的未命名和无编号的 GUI.</p>
<p><em>Options</em> 可以包含主 GUI 命令支持的任意<a href="#Options">选项</a>.</p>
<p>如果省略 <em>Title</em>, 则使用脚本文件名.</p>
<p>这个子命令附带以下注意事项:</p>
<ul>
    <li>大多数情况下, 会按需自动创建窗口, 所以通常无需调用 <code>Gui New</code>.</li>
    <li>尽管新窗口会被设为<em>当前</em>线程的<a href="#Default">默认</a>窗口, 但非 GUI 线程的<a href="#DefaultWin">默认窗口仍为编号 1 的 GUI</a>.</li>
    <li>如果该 GUI 没有名称且非<a href="#Default">默认 GUI</a>, 则操作时必须使用其 HWND. 通过 <a href="#GuiHwndOutputVar">+Hwnd<i>GuiHwnd</i></a> 选项可以保存新窗口的句柄到 <em>GuiHwnd</em>. <code>Gui, %<i>GuiHwnd</i>%:Default</code> 可将其设为其他 Gui 命令的默认操作对象.</li>
</ul>
<p>好的方面是:</p>
<ul>
    <li>调用 <code>Gui New</code> 可确保脚本创建新的 GUI 而不修改已有的 GUI. 这也使的脚本目的明确, 其他用户(或自己以后) 更容易看懂.</li>
    <li><code>Gui New</code> 使得无需获取每个 GUI 的句柄和编号. 如果脚本需要创建多个 GUI 或打算包含于其他脚本时, 这样特别有用.</li>
    <li>有时, 创建 GUI 而不<a href="#Show">显示</a>时设置窗口的标题会更直观.</li>
</ul>
<p>如果不指定名称, 则应用下列规则:</p>
<ul>
    <li>特殊的<a href="#Labels">标签</a>(如 <a href="#GuiClose">GuiClose</a>) 含有默认的 "Gui" 前缀, 不过可以在选项中使用 <a href="#PlusLabel">+Label<em>Prefix</em></a> 覆盖.</li>
    <li>不论 GUI 是否开启了新线程, <a href="../Variables.htm#Gui">A_Gui</a> 总是包含句柄而非名称.</li>
</ul>
<p class="note"><strong>注意</strong>: 在 <span class="ver">[v1.1.08]</span> 之前, 在指定名称时此子命令不会设置它为默认的 Gui.</p>

<h3 id="Add">Add</h3>
<p>添加控件到 GUI 窗口(必要时首先创建 GUI 窗口).</p>
<pre class="Syntax"><span class="func">Gui</span>, Add, ControlType <span class="optional">, Options, Text</span></pre>
<p><em>ControlType</em> 为下列的其中一个:</p>
<ul>
    <li><a href="GuiControls.htm#Text">Text(文本)</a>, <a href="GuiControls.htm#Edit">Edit(编辑框)</a>, <a href="GuiControls.htm#UpDown">UpDown(加减按钮)</a>, <a href="GuiControls.htm#Picture">Picture(图片)</a></li>
    <li><a href="GuiControls.htm#Button">Button(按钮)</a>, <a href="GuiControls.htm#Checkbox">Checkbox(勾选框)</a>, <a href="GuiControls.htm#Radio">Radio(单选按钮)</a></li>
    <li><a href="GuiControls.htm#DropDownList">DropDownList(下拉列表)</a>, <a href="GuiControls.htm#ComboBox">ComboBox(组合框)</a></li>
    <li><a href="GuiControls.htm#ListBox">ListBox(列表框)</a>, <a href="ListView.htm">ListView(列表视图)</a>, <a href="TreeView.htm">TreeView(树形列表)</a></li>
    <li><a href="GuiControls.htm#Link">Link(链接)</a>, <a href="GuiControls.htm#Hotkey">Hotkey(热键)</a>, <a href="GuiControls.htm#DateTime">DateTime(时间日期选择器)</a>, <a href="GuiControls.htm#MonthCal">MonthCal(月历)</a></li>
    <li><a href="GuiControls.htm#Slider">Slider(滑块)</a>, <a href="GuiControls.htm#Progress">Progress(进度条)</a></li>
    <li><a href="GuiControls.htm#GroupBox">GroupBox(分组框)</a>, <a href="GuiControls.htm#Tab">Tab(选项卡)</a>, <a href="GuiControls.htm#StatusBar">StatusBar(状态栏)</a></li>
    <li><a href="GuiControls.htm#ActiveX">ActiveX</a>(例如 Internet Explorer 控件)</li>
    <li><a href="GuiControls.htm#Custom">Custom(自定义控件)</a></li>
</ul>
<p><em>Options</em> 是一个由零或多个选项组成的字符串, 如以下章节所述:</p>
<ul>
  <li><a href="#PosSize">控件的位置和大小</a></li>
  <li><a href="#Events">存储和响应用户输入</a></li>
  <li><a href="#OtherOptions">控件: 通用样式和其他选项</a></li>
</ul>
<p>例如:</p>
<pre>Gui, Add, Text,, Please enter your name:
Gui, Add, Edit, vName
Gui, Show</pre>

<h3 id="Show">Show</h3>
<p>如果没有在 <em>Options</em> 中明确指定, 那么此命令会让窗口以可见, 非最小化(必要时), <a href="WinActivate.htm">激活</a>并设置它的标题的状态显示.</p> 
<pre class="Syntax"><span class="func">Gui</span>, Show <span class="optional">, Options, Title</span></pre>
<p>如果省略了 <em>Title</em>, 则保留原来的标题(如果没有, 则使用脚本的文件名).</p>
<p>省略后面的 X, Y, W 和 H 选项则让窗口保持原来的大小和位置. 如果之前没有设置过位置, 则在后面提到的 X 和/或 Y 选项没有指明的坐标上窗口将自动居中. 如果之前没有设置过大小, 则窗口会根据它所包含控件的大小和位置自动调整大小.</p>
<p>在 <em>Options</em> 中可以包含零个或多个下列字符串(规定其中的数字使用十进制, 而不是十六进制):</p>
<p><strong>Wn</strong>: 指定 <strong>n</strong> 为窗口工作区的宽度(单位为像素), 窗口工作区指除了窗口边框, 标题栏和<a href="#Menu">菜单栏</a>的区域.</p>
<p><strong>Hn</strong>: 指定 <strong>n</strong> 为窗口工作区的高度, 单位为像素.</p>
<p><strong>Xn</strong>: 指定 <strong>n</strong> 为窗口在屏幕中的 X 坐标, 单位为像素. 0 表示屏幕最左边首列可见像素的位置.</p>
<p><strong>Yn</strong>: 指定 <strong>n</strong> 为窗口在屏幕中的 Y 坐标, 单位为像素. 0 表示屏幕最上边首行可见像素的位置.</p>
<p><strong>Center</strong>: 让窗口在屏幕的水平和垂直方向上居中.</p>
<p><strong>xCenter</strong>: 让窗口在屏幕的水平方向上居中. 例如: <code>Gui, Show, xCenter y0</code>.</p>
<p><strong>yCenter</strong>: 让窗口在屏幕的垂直方向上居中.</p>
<p id="AutoSize"><strong>AutoSize</strong>: 根据窗口当前包含的可见控件调整窗口的大小. 这常在添加新控件, 调整现有控件的大小或隐藏/显示现有控件后用来调整窗口的大小. 例如: <code>Gui, Show, AutoSize Center</code></p>
<p><strong>Minimize</strong>: 最小化当前窗口并激活其下方的窗口.</p>
<p><strong>Maximize</strong>: 最大化并激活窗口.</p>
<p><strong>Restore</strong>: 当窗口处于最小化或最大化状态时, 还原窗口. 当窗口隐藏且不活动时, 则显示并激活窗口.</p>
<p><strong>NoActivate</strong>: 当窗口处于最小化或最大化状态时, 还原窗口. 窗口显示但不进行激活.</p>
<p><strong>NA</strong>: 显示窗口但不进行激活. 如果窗口处于最小化状态, 那么它仍保持这种状态, 但可能提升它的 z 顺序(这是在 alt-tab 选择器中看到的顺序). 如果窗口之前是隐藏的, 则此参数可能会让它显示在当前仍处于活动状态的窗口上面.</p>
<p><strong>Hide</strong>: 隐藏窗口并激活其下方的窗口. 除了允许隐藏窗口被移动, 重设大小或在不显示的情况下设置新的标题外, 此参数与 <a href="#Cancel">Gui Cancel</a> 的功能相同. 例如: <code>Gui, Show, Hide x55 y66 w300 h200, New Title</code>.</p>

<h3 id="Submit">Submit</h3>
<p>保存每个控件的内容到其<a href="#var">关联变量</a>中(如果有) 并且在没有使用 NoHide 选项时隐藏窗口.</p>
<pre class="Syntax"><span class="func">Gui</span>, Submit <span class="optional">, NoHide</span></pre>
<p>对于那些产生多个字段输出的控件, 例如<a href="GuiControls.htm#ListBoxMulti">多选列表框</a>, 输出结果中使用窗口的<a href="#Delimiter">当前分隔符</a>来分隔多个字段的内容. 如果由于之前使用 <a href="#Destroy">Gui Destroy</a> 销毁了窗口或其他原因使得窗口不存在, 那么此子命令没有效果.</p>

<div id="Cancel"><h3 id="Hide">Cancel / Hide</h3></div>
<p>隐藏当前窗口, 并不保存控件的内容到其<a href="#var">关联变量</a>中.</p>
<pre class="Syntax"><span class="func">Gui</span>, Cancel
<span class="func">Gui</span>, Hide</pre>
<p>如果由于之前使用 <a href="#Destroy">Gui Destroy</a> 销毁了窗口或其他原因使得窗口不存在, 那么此子命令没有效果.</p>

<h3 id="Destroy">Destroy</h3>
<p>移除当前窗口(如果它存在) 及其所有控件, 并释放其占用的内存和系统资源.</p>
<pre class="Syntax"><span class="func">Gui</span>, Destroy</pre>
<p>如果脚本之后重新创建窗口, 那么窗口的所有属性(例如颜色和字体) 初始都为默认值(如同窗口从没有出现过一样). 如果没有使用 <code>Gui Destroy</code>, 则当脚本退出时会自动销毁所有的 GUI 窗口.</p>

<h3 id="Font">Font</h3>
<p>为在此处之后创建的控件设置字体字型, 大小, 样式和/或颜色.</p>
<pre class="Syntax"><span class="func">Gui</span>, Font <span class="optional">, Options, FontName</span></pre>
<p>例如:</p>
<pre>gui, font, s10, Verdana  <em>; 设置 10 点大小的 Verdana 字体.</em></pre>
<p>省略最后两个参数可以让字体恢复为系统默认的 GUI 字型, 大小和颜色.</p>
<p><em>FontName</em> 可以是任意字体的名称, 例如<a href="../misc/FontsStandard.htm">字体表</a>的其中一个. 如果省略了 <em>FontName</em> 或此字体在系统中不存在, 则使用之前的字体字型(如果没有, 则使用系统默认的 GUI 字型). 即使某些系统缺少首选字体, 这种特性也可以让窗口在多个系统上具有类似的字体. 例如, 按顺序执行下列命令, 则 Verdana 字体优先于 Arial, 而 Arial 字体优先于 MS Sans Serif:</p>
<pre>Gui, Font,, MS Sans Serif
Gui, Font,, Arial
Gui, Font,, Verdana  <em>; 首选字体.</em></pre>
<p>如果 <em>Options</em> 参数为空, 则使用之前的字体属性. 或者可以在其中指定下列的一个或多个选项字母:</p>
<p><strong>C</strong>: 颜色名称(请参阅<a href="Progress.htm#colors">颜色图表</a>) 或 RGB 值, 或指定单词 Default 来恢复到系统默认颜色(大多数系统的默认颜色为黑色). 例如: <code>cRed</code>, <code>cFFFFAA</code>, <code>cDefault</code>. 注意: <a href="GuiControls.htm#Button">按钮</a>不遵循自定义颜色. 此外, 可以通过包含 C 选项创建带有字体颜色的特殊控件不会受到当前选项的影响. 例如: <code>Gui, Add, Text, cRed, My Text</code>.</p>
<p><strong>S</strong>: 字体大小(单位为磅). 例如: <code>s12</code>(规定为十进制, 而不是十六进制)</p>
<p><strong>W</strong>: 字体粗细, 这是介于 1 和 1000  之间的数字(400 为标准大小而 700 为粗体). 例如: <code>w600</code>(规定为十进制, 而不是十六进制)</p>
<p>还支持使用下列单词: <strong>bold</strong>, <em>italic</em>, <s>strike</s>, <u>underline</u> 和 norm. 指定 <em>Norm</em> 则让字体恢复标准粗细并去除斜体, 删除线和下划线效果(但保持现有的颜色和大小). 可以使用 norm 去除所有属性然后有选择的设置其他属性. 例如, 指定 <code>norm italic</code> 将设置字体为标准然后增加斜体属性.</p>
<p>要指定多个选项, 请在选项间使用空格分隔. 例如: <code>cBlue s12 bold</code>.</p>
<p>如果一个脚本中创建了<a href="#MultiWin">多个 GUI 窗口</a>, 那么其中的每个窗口都会记住它自己的 "当前字体" 属性, 可以用于后面创建的控件.</p>
<p>相关提示, 操作系统提供了标准的对话框让用户选取字体, 颜色或图标. 使用 <a href="DllCall.htm">DllCall()</a> 可以显示这些对话框, 演示的例子请参阅 <a href="https://github.com/majkinetor/mm-autohotkey/tree/master/Dlg">GitHub</a>.</p>
<p id="fontq"><strong>Q</strong>: <span class="ver">[AHK_L 19+]:</span> 文本呈现质量. 例如: <code>q3</code>. 应该在 Q 后跟着下表中的一个数字:</p>
<table class="info">
  <tr>
        <th>数字</th>
        <th abbr="Constant">Windows 常量</th>
        <th abbr="Descr">描述</th>
    </tr>
    <tr>
        <td>0</td>
        <td>DEFAULT_QUALITY</td>
        <td>保持字体的外观.</td>
  </tr>
  <tr>
        <td>1</td>
        <td>DRAFT_QUALITY</td>
        <td>字体外观不如使用 PROOF_QUALITY 值时那么重要.</td>
  </tr>
  <tr>
        <td>2</td>
        <td>PROOF_QUALITY</td>
        <td>字体的字符质量比准确符合逻辑字体属性更重要.</td>
  </tr>
  <tr>
        <td>3</td>
        <td>NONANTIALIASED_QUALITY</td>
        <td>不对字体修边, 即不进行平滑处理.</td>
  </tr>
  <tr>
        <td>4</td>
        <td>ANTIALIASED_QUALITY</td>
        <td>如果字体支持且字体不会太小或太大时, 则对字体进行修边或平滑.</td>
  </tr>
  <tr>
        <td>5</td>
        <td>CLEARTYPE_QUALITY</td>
        <td>Windows XP 以及更高版本: 如果设置此选项, 则(尽可能) 使用 ClearType 抗锯齿方法描绘文本.</td>
</tr>
</table>
<p>关于这些值含义的更多细节, 请参阅 <a href="http://msdn.microsoft.com/en-us/library/dd183499.aspx">MSDN: CreateFont</a>.</p>
<p>由于默认设置通常是最好的品质, 所以这个功能往往用于在特殊情况时禁用抗锯齿效果, 这样可以让文本更清晰.</p>

<h3 id="Color">Color</h3>
<p>设置窗口和/或其控件的背景颜色.</p>
<pre class="Syntax"><span class="func">Gui</span>, Color <span class="optional">, WindowColor, ControlColor</span></pre>
<p>设置 <em>WindowColor</em> 为 GUI 窗口自己的背景颜色. <em>ControlColor</em> 应用于窗口中所有现在和将来的控件(不过某些类型的控件不支持自定义颜色). 虽然 <a href="ListView.htm">ListViews</a> 和 <a href="TreeView.htm">TreeViews</a> 初始颜色遵循 <em>ControlColor</em>, 但之后改变 <em>ControlColor</em> 不会对它们造成影响. 在这种情况下, 使用 <code>GuiControl +BackgroundFF9977, MyListView</code> 来明确更改它们的颜色.</p>
<p>让两个参数中的某个留空可以保持当前的颜色设置. 否则, 指定 16 种 <a href="Progress.htm#colors">HTML 基础颜色</a>之一或 6 位的 RGB 颜色值(0x 前缀可以省略), 或指定单词 Default 来恢复到默认颜色. 例如: <code>Silver</code>, <code>FFFFAA</code>, <code>0xFFFFAA</code>, <code>Default</code>.</p>
<p>默认情况下, 窗口的背景颜色为系统按钮的颜色, 而控件的背景颜色为系统默认窗口的颜色(通常为白色).</p>
<p><a href="#Menu">菜单栏</a>及其子菜单的颜色可以这样改变, 例如: <code><a href="Menu.htm">Menu</a>, MyMenuBar, Color, White</code>.</p>
<p>要让窗口的背景透明, 请使用 <a href="WinSet.htm#TransColor">WinSet TransColor</a>. 然而, 如果在进行这样的操作前没有使用 <a href="#Color">Gui Color</a> 为窗口设置自定义的颜色, 那么按钮也将变成透明的. 要避免此问题, 应首先为窗口设置自定义的颜色, 然后让此颜色透明. 例如:</p>
<pre>Gui, Color, EEAA99
Gui +LastFound  <em>; 让 GUI 窗口成为<a href="../misc/WinTitle.htm#LastFoundWindow">上次找到的窗口</a>以用于下一行的命令.</em>
WinSet, TransColor, EEAA99</pre>
<p>此外, 如果要移除背景透明的窗口的边框和标题栏, 请在设置窗口为透明 <strong>后</strong> 使用下面的命令:</p>
<pre>Gui -Caption  <em>; 如果它不是<a href="#DefaultWin">默认窗口</a>, 则使用 <i>Gui, GuiName:-Caption</i>.</em></pre>
<p>为了阐明上面的情况, 请参阅此页面底部的屏幕显示(OSD) 的例子.</p>

<h3 id="Margin">Margin</h3>
<p>在自动排列没有明确指定 <a href="#XY">X 或 Y 坐标</a>的控件时, 设置距离窗口的左/右和上/下侧留下的空间的像素值.</p>
<pre class="Syntax"><span class="func">Gui</span>, Margin <span class="optional">, X, Y</span></pre>
<p>此外, 还可以使用边距来确定自动定位控件之间的垂直距离和水平距离. 最后, 第一次使用 <a href="#Show">Gui Show</a> 来计算窗口的大小时, 要考虑到此边距(在没有明确指定窗口大小时).</p>
<p><code>Gui, Margin</code> 仅影响<a href="#Default">默认窗口</a>, 而 <code>Gui, Name:Margin</code> 仅影响<a href="#MultiWin">命名窗口</a>. 如果没有使用此命令, 当添加首个控件到窗口时, 窗口会根据当前选择的<a href="#Font">字体</a>的大小按比例计算出默认的边距(上下边距为字体高度的 0.75 倍, 而左右边距为字体高度的 1.25 倍).</p>
<p>尽管在添加控件的过程中可以改变边距, 但这仅影响后面添加的控件, 而不影响现在的. 最后, X 或 Y 的其中任意一个可以留空来保持相应的边距不变.</p>

<h3 id="Options">窗口的选项和样式</h3>
<p>在 GUI 命令之后, 可以立即指定一个或多个选项.</p>
<pre class="Syntax"><span class="func">Gui</span>, +/-Option1 +/-Option2 ...</pre>
<p>处于性能原因, 最好在一行中设置所有选项, 并在创建窗口之前(即在使用任何其他子命令例如 <a href="#Add">Gui Add</a> 之前) 使用一行语句指定所有的选项.</p>
<p>此命令的效果是累加的; 即它只改变那些明确指定的选项, 而其他所有选项则保持不变.</p>
<p>在选项前指定加号表示增加此选项, 而减号表示移除它. 例如:</p>
<pre>Gui +Resize -MaximizeBox  <em>; 改变<a href="#DefaultWin">默认</a> GUI 窗口的设置.</em>
Gui <strong>MyGui:</strong>+Resize -MaximizeBox  <em>; 改变名称为 <i>MyGui</i> 的 GUI 窗口的设置.</em></pre>
<p><strong>AlwaysOnTop</strong>: 让窗口置顶, 与 <a href="WinSet.htm#AlwaysOnTop">WinSet AlwaysOnTop</a> 的效果相同.</p>
<p><strong>Border</strong>: 为窗口增加细边框. 此选项不常用.</p>
<p><strong>Caption</strong>(默认具有此选项): 为窗口增加标题栏和粗边框. 如果要移除将要使用 <a href="WinSet.htm#TransColor">WinSet TransColor</a> 设置透明的窗口的标题栏, 那么在需要在设置 TransColor 后才进行移除.</p>
<p id="Delimiter"><strong>Delimiter</strong>: 指定管道(|) 外的其他字符作为窗口的字段分隔符, 每当使用 <a href="#Add">Gui Add</a> 添加, 使用 <a href="GuiControl.htm">GuiControl</a> 修改, 使用 <a href="#Submit">Gui Submit</a> 或 <a href="GuiControlGet.htm">GuiControlGet</a> 获取控件的内容时. 在单词 Delimiter 后紧跟着单个字符. 例如, <code>Gui +Delimiter`n</code> 将使用换行符, 这可能特别适合于<a href="../Scripts.htm#continuation">延续片段</a>. 同样, 使用 <code>Gui +Delimiter|</code> 将恢复为默认的分隔符. 要使用空格或 tab, 指定 <code>Gui +DelimiterSpace</code> 或 <code>Gui +DelimiterTab</code>. 一旦改变数据分隔符, 它会影响作用于这个特殊窗口的所有现在和后续的<a href="../misc/Threads.htm">线程</a>.</p>
<p><strong>Disabled</strong>: 禁用窗口, 阻止用户和窗口中的控件交互. 此选项常用于含有子窗口的窗口(请参阅 <a href="#Owner">Owner</a>).</p>
<p id="DPIScale"><strong>DPIScale</strong> <span class="ver">[v1.1.11+]</span>: 使用 <code>Gui -DPIScale</code> 禁用 DPI 缩放, 它默认是启用的. 如果在使用非标准 DPI 设置的系统上启用 DPI 缩放, 则 Gui 子命令会自动调整坐标和尺寸来让控件具有大致相同的外观尺寸(不过解析率更高). 例如, 对于 144(150%) 的 DPI, <code>Gui Show, w100</code> 会让 Gui 宽度为 150 像素, 但 <a href="../Variables.htm#GuiWidth">A_GuiWidth</a> 将保持 100. <a href="../Variables.htm#ScreenDPI">A_ScreenDPI</a> 包含了系统当前 DPI.</p>
<p>DPI 缩放比例仅适用于 Gui 子命令, 所以类似 ControlGetPos 或 WinGetPos 命令返回的坐标无法工作. 解决方案如下列:</p>
<ul>
    <li>尽量避免使用硬编码坐标系统. 例如, 使用类似 <a href="#xp">xp</a>, <a href="#xs">xs</a>, <a href="#xm">xm</a> 和 <a href="#PosPlusMargin">x+m</a> 选项设置控件的相对位置且用像素来设置<a href="#R">多行文本</a>的高度值.</li>
    <li>根据具体情况灵活的开启 (<code>Gui +DPIScale</code>) 和关闭 (<code>Gui -DPIScale</code>) DPI 缩放比例设置. 更改这个设置并不会影响已经设置过的坐标或大小.</li>
    <li>手动测量坐标. 例如, <code>x*(A_ScreenDPI/96)</code> 会将 x 从 Gui 坐标系(逻辑) 转换为非 Gui 坐标系(物理).</li>
</ul>
<p id="GuiHwndOutputVar"><strong>Hwnd</strong><em>OutputVar</em> <span class="ver">[v1.1.04+]:</span> 此选项保存 GUI 的窗口句柄(HWND) 到 <em>OutputVar</em>. 例如: <code>Gui +HwndMyGuiHwnd</code>. 在函数中使用时, <em>MyGuiHwnd</em> 会被视为<a href="../Functions.htm#DynVar">函数动态变量</a>. GUI 的 HWND 常用于 <a href="PostMessage.htm">PostMessage</a>, <a href="PostMessage.htm">SendMessage</a> 和 <a href="DllCall.htm">DllCall()</a>. 它还可以直接作为 <a href="../misc/WinTitle.htm#ahk_id">ahk_id WinTitle</a> 或代替 GUI 名称来使用, 例如 <code>Gui %MyGuiHwnd%:Destroy</code>.</p>
<p id="PlusLabel"><strong>Label</strong> <span class="ver">[v1.0.44.09+]:</span> 为当前窗口的<a href="#Labels">特殊标签</a>指定自定义名称. 例如, <code>Gui MyGui:+LabelMyGui_On</code> 将使用标签 MyGui_OnClose 和 MyGui_OnSize(如果它们存在) 分别代替 MyGuiGuiClose 和 MyGuiGuiSize. 换句话说, 在所有<a href="#Labels">特殊标签</a>的名称中字符串 "MyGuiGui" 被替换为 "MyGui_On". 这可以让多个窗口使用一套相同的标签(此时脚本可以根据 <a href="../Variables.htm#Gui">A_Gui</a> 来确定运行子程序的窗口是哪个).</p>
<p id="LastFound"><strong>LastFound</strong>: 设置窗口为<a href="../misc/WinTitle.htm#LastFoundWindow">上次找到的窗口</a>(对于 <a href="#DefaultWin">Gui 线程</a>这是多余的, 因为它自动设置了), 这样允许类似 <a href="WinSet.htm">WinSet</a> 这样的命令对此窗口进行操作, 即使它当前为隐藏状态(即不需要使用 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a>). 需要在显示窗口之前改变其属性时, 这是非常有用的. 例如:</p>
<pre>Gui +LastFound
WinSet, TransColor, %CustomColor% 150
Gui Show</pre>
<p id="LastFoundExist"><strong>LastFoundExist</strong> <span class="ver">[v1.0.43.09+]:</span> 和其他选项不同, LastFoundExist 选项只有在单独使用时才有效. <em>+LastFoundExist</em> 的效果与 <em>+LastFound</em> 相同, 不过如果窗口不存在时不会创建窗口. 此选项的主要用途是判断是否存在某特殊的窗口. 例如:</p>
<pre>Gui MyGui:+LastFoundExist
if WinExist()
    MsgBox GUI "MyGui" already exists.</pre>
<p><strong>MaximizeBox</strong>: 启用标题栏上的最大化按钮. 下面的 <em>Resize</em> 也含有此效果.</p>
<p><strong>MinimizeBox</strong>(默认含有此选项): 启用标题栏上的最小化按钮.</p>
<p id="MinSize"><strong>MinSize</strong> 和 <strong>MaxSize</strong> <span class="ver">[v1.0.44.13+]:</span> 限定窗口的最小尺寸和最大尺寸, 例如当用户拖动窗口边框改变其大小的时候. 指定不带后缀的单词 <em>MinSize</em> 和/或 <em>MaxSize</em> 来使用窗口当前尺寸作为限制大小(如果没有窗口当前尺寸, 则使用首次 <a href="#Show">Gui Show</a> 时显示的大小). 还可以在后面加上宽度, 跟着 X 和高度, 例如: <code>Gui +Resize +MinSize640x480</code>. 它们指定了以像素为单位的窗口工作区(不包括边框, 标题栏和<a href="#Menu">菜单栏</a>) 的大小. 规定每个数字为十进制, 而不是十六进制.</p>
<p>可以省略高度或宽度以保持不变(例如 <code>+MinSize640x</code> 或 <code>+MinSizex480</code>). 而且, 可以多次指定 Min/MaxSize 以便在一个方向上使用窗口当前的尺寸而另一个则使用指定的大小. 例如, <code>+MinSize +MinSize640x</code> 表示最小高度限制为窗口当前的大小而最小宽度限制为 640.</p>
<p>如果从没有使用 <em>MinSize</em> 和 <em>MaxSize</em>, 则使用操作系统的默认值(同样地, 可以使用 <code>Gui -MinSize -MaxSize</code> 恢复为此默认值).</p>
<p class="note"><strong>注意</strong>: 必须含有 <a href="#Resize">+Resize</a> 才能允许用户调节窗口的大小.</p>
<p id="OwnDialogs"><strong>OwnDialogs</strong>: 在每个<a href="../misc/Threads.htm">线程</a>(例如 ButtonOK 子线程) 中指定 <code>Gui +OwnDialogs</code>, 这样所有后续的 <a href="MsgBox.htm">MsgBox</a>, <a href="InputBox.htm">InputBox</a>, <a href="FileSelectFile.htm">FileSelectFile</a> 以及 <a href="FileSelectFolder.htm">FileSelectFolder</a> 对话框才会成为当前窗口的子窗口. 这时这些对话框成为模式对话框, 这意味着用户必须先关闭这些对话框才能和它们的父窗口进行交互. 与之相比, <a href="ToolTip.htm">ToolTip</a>, <a href="Progress.htm">Progress</a> 和 <a href="Progress.htm">SplashImage</a> 窗口即使成为了其他窗口的子窗口也为非模式的; 它们仅仅是永远显示在其父窗口的上面. 在模式和非模式窗口两种情况中, 当它们的父窗口<a href="#Destroy">销毁</a>时它们也会被自动销毁.</p>
<p>一般情况下打开这个设置后不需要再切换到关闭, 因为它不影响其他<a href="../misc/Threads.htm">线程</a>. 但是, 如果一个线程需要显示从属和非从属对话框, 则可以使用 <code>Gui -OwnDialogs</code> 关闭此设置.</p>
<p>如果在前缀中没有使用窗口名称(例如使用 <code>Gui +OwnDialogs</code> 而不是 <code>Gui MyGui:+OwnDialogs</code>), 则当前<a href="#DefaultWin">线程的默认窗口</a>将拥有这些从属对话框.</p>
<p id="Owner"><strong>Owner</strong>: 使用 <em>+Owner</em> 可以让当前窗口从属于另一个窗口. 从属的窗口默认不显示在任务栏, 并且它总是显示在其父窗口的上面. 当其父窗口销毁时它也被自动销毁. <em>+Owner</em> 必须在父窗口创建 <u>后</u> 使用, 而在 <span class="ver">[v1.1.05]</span> 及更高版本中可以在从属窗口创建前面或后面使用. <em>+owner</em> 有两种使用方法, 如下所示:</p>
<pre>Gui, MyGui:+OwnerMyOtherGui  <em>; 让 <i>MyGui</i> 成为 <i>MyOtherGui</i> 的子窗口.</em>
Gui, MyGui:+Owner  <em>; 让 <i>MyGui</i> 成为<a href="Menu.htm#MainWindow">脚本主窗口</a>的子窗口, 这样可以阻止任务栏按钮的显示.</em></pre>
<p><span class="ver">[v1.1.03+]:</span> <code>+Owner</code> 后面可以紧跟着现有的 Gui 或任何顶级窗口的 <a href="WinGet.htm#ID">HWND</a> 的<a href="#Name">名称</a>或编号.</p>
<p class="note"><strong>兼容性注意</strong>: 在 <span class="ver">[v1.1.03]</span> 及更高版本中, <code>+Owner</code> 移除 WS_CHILD 样式并设置 WS_POPUP 样式. 要设置某个 Gui 的父窗口, 脚本必须使用 <code>+Parent</code> 选项或<em>在</em> <code>+Owner</code> 选项后覆盖适当的样式.</p>
<p>在某个从属窗口显示时要防止用户与其父窗口交互, 请使用 <code>Gui +Disabled</code> 禁用父窗口. 之后(当子窗口取消或销毁时), 通过 <code>Gui -Disabled</code> 来重新启用父窗口. 在取消或销毁子窗口前这样做可以让父窗口自动恢复有效.</p>
<p id="Parent"><strong>Parent</strong> <span class="ver">[v1.1.03+]</span>: 使用 <code>+Parent</code> 后面紧跟着要拥有此窗口的现有 Gui 或任何窗口或控件的 <a href="WinGet.htm#ID">HWND</a> 的<a href="#Name">名称</a>或编号. 要恢复 Gui 为顶级窗口, 请使用 <code>-Parent</code>. 在窗口创建后此选项也有效.</p>
<p id="Resize"><strong><a name="Resize"></a>Resize</strong>: 此选项允许用户重新调整窗口的大小并启用标题栏上的最大化按钮. 要禁用最大化按钮, 请指定 <code>+Resize -MaximizeBox</code>.</p>
<p><strong>SysMenu</strong>(默认含有此选项): 指定 <code>-SysMenu</code>(负 SysMenu) 可以删除点击窗口左上角时弹出的系统菜单和图标. 同时也删除标题栏上的最小化, 最大化和关闭按钮.</p>
<p id="Theme"><strong>Theme</strong>: 指定 <code>-Theme</code>, 可以让后续创建的所有控件在 Windows XP 以及更高版本中使用经典主题外观. 之后要创建其他使用当前主题的控件时, 请使用 <code>+Theme</code> 把设置切换回来.</p>
<p class="note"><strong>注意</strong>: 此选项在比 Windows XP 早的系统上没有效果, 如果 XP 中当前使用经典主题时也没有效果.</p>
<p>最后, 对于单独的控件还可以在其创建的选项中指定 <code>+Theme</code> 或 <code>-Theme</code> 来改变此设置.</p>
<p><strong>ToolWindow</strong>: 让窗口显示细标题栏, 同时去除任务栏按钮. 无论是否存在 <a href="../misc/Styles.htm#WS_MAXIMIZEBOX">WS_MAXIMIZEBOX</a> 和 <a href="../misc/Styles.htm#WS_MINIMIZEBOX">WS_MINIMIZEBOX</a> 样式, 这总是隐藏了最大化和最小化按钮.</p>
<p><strong>(未命名样式)</strong>: 在十进制或十六进制的<a href="../misc/Styles.htm">样式编号</a>前加上加号或减号表示添加或删除此样式.</p>
<p><strong>(未命名扩展样式)</strong>: 在字母 E 和十进制或十六进制的扩展样式编号前加上加号或减号表示添加或删除此扩展样式. 例如, <code>+E0x40000</code> 表示添加 WS_EX_APPWINDOW 样式, 此样式让窗口显示任务栏按钮. 对于这里没有列出其他的扩展样式编号(因为它们极少使用), 请参阅 <a href="https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles">Extended Window Styles | Microsoft Docs</a> 以获取完整的列表.</p>

<h3 id="Menu">Menu</h3>
<p>添加菜单栏到窗口.</p>
<pre class="Syntax"><span class="func">Gui</span>, Menu <span class="optional">, MenuName</span></pre>
<p>使用 <a href="Menu.htm">Menu</a> 命令可以创建普通的菜单. 例如:</p>
<pre>Menu, FileMenu, Add, &amp;Open<a href="../misc/EscapeChar.htm">`t</a>Ctrl+O, MenuFileOpen  <em>; 关于 Ctrl+O 请参阅后面的备注.</em>
Menu, FileMenu, Add, E&amp;xit, MenuHandler
Menu, HelpMenu, Add, &amp;About, MenuHandler
Menu, MyMenuBar, Add, &amp;File, :FileMenu  <em>; 附加上面的两个子菜单.</em>
Menu, MyMenuBar, Add, &amp;Help, :HelpMenu
Gui, Menu, MyMenuBar</pre>
<p>注意在上面的首行中, <code>&amp;Open</code> 后面跟着 <code>Ctrl+O</code>(它们之间含 tab). 这表示用户可以按下快捷键代替选择菜单项来执行操作. <span class="ver">[v1.1.04+]:</span> 如果这样的快捷键中只使用了标准的修饰键名称 Ctrl, Alt 和 Shift, 那么它会被自动注册为这个 GUI 的<em>键盘快捷键</em>. 不含修饰键的单字母快捷键是区分大小写的, 且可以使用不常见的方法触发, 例如 IME 或 <kbd>Alt</kbd>+NNNN.</p>
<p>如果特殊的按键组合没有自动生效, 请使用<a href="_IfWinActive.htm">上下文相关热键</a>. 然而, 这样的热键一般不能使用 <a href="Send.htm">Send</a> 触发, 并且比起标准的键盘快捷键它们更可能和其他脚本产生冲突.</p>
<p>要移除窗口当前的菜单栏, 请使用 <code>Gui Menu</code>(即省略最后一个参数).</p>
<p>一旦菜单被设置为窗口的菜单栏, 它就不能用于弹出菜单或子菜单. 这是因为菜单栏内部使用了不同的格式(不过, 这只限制菜单栏自身, 而不包括其子菜单). 如果您一定要这样实现, 那么先创建一个菜单用于菜单栏, 再创建另一个相同的菜单用于其他目的.</p>
<p>对当前正用于菜单栏(在某些情况下包括其子菜单) 使用某些破坏性的 <a href="Menu.htm">menu 子命令</a>(例如 Delete 和 DeleteAll) 时, 这些命令会无效并显示错误对话框(可以使用 <a href="Menu.htm">UseErrorLevel</a> 来避免). 可以使用下列步骤改变窗口菜单栏中的菜单: 1) 使用 <code>Gui Menu</code>(省略 <em>MenuName</em>) 从窗口中分离菜单; 2) 改变菜单; 3) 使用 <code>Gui, Menu, MyMenuBar</code> 重新附加菜单到窗口.</p>

<div id="Restore"><div id="Maximize"><h3 id="Minimize">Minimize / Maximize / Restore</h3></div></div>
<p>打开窗口(如果需要), 然后对其执行指定的操作.</p>
<pre class="Syntax"><span class="func">Gui</span>, Minimize
<span class="func">Gui</span>, Maximize
<span class="func">Gui</span>, Restore</pre>
<p>如果该窗口不存在 -- 可能由于通过 <a href="#Destroy">Gui Destroy</a> 销毁了 -- 则该子命令无效.</p>

<h3 id="Flash">Flash</h3>
<p>闪烁窗口的任务栏按钮.</p>
<pre class="Syntax"><span class="func">Gui</span>, Flash <span class="optional">, Off</span></pre>
<p>这是通过反转窗口的标题栏和/或任务栏按钮(如果有) 的颜色实现的. 可以加上选项 OFF 让标题栏和任务栏按钮恢复到它们最初的颜色(但实际效果可能受操作系统版本影响). 在下面的例子中, 窗口将闪烁三次, 因为每对闪烁都会在对它们反转后恢复原来的外观:</p>
<pre>Loop 6
{
    Gui Flash
    Sleep 500  <em>; 这个时间值十分敏感, 改变它可能引起异常.</em>
}</pre>

<h3 id="Default">Default</h3>
<p>改变<a href="../misc/Threads.htm">当前线程</a>的默认 <a href="#MultiWin">GUI 窗口名称</a>.</p>
<pre class="Syntax"><span class="func">Gui</span>, GuiName:Default</pre>
<p>这是在没有指定窗口名称时用于 <a href="GuiControl.htm">GuiControl</a>, <a href="GuiControlGet.htm">GuiControlGet</a> 和 Gui 命令自身的默认窗口. 在接下来的例子中, 默认窗口名称被改变为 "MyGui": <code>Gui MyGui:Default</code>. 请参阅<a href="#DefaultWin">线程的默认窗口</a>了解关于默认窗口的更多细节.</p>
<p><span class="ver">[v1.1.03+]:</span> <em>GuiName</em> 可以是一个脚本的 GUI 窗口的 <a href="#GuiHwndOutputVar">HWND</a>. 如果窗口有一个名称, 它就会成为默认名称并且即使在窗口本身被销毁之后仍然是这样. 如果窗口没有名称, 当窗口被销毁时, 默认名称将恢复为 1.</p>
<p><span class="ver">[v1.1.23+]:</span> 内置变量 <a href="../Variables.htm#DefaultGui"><strong>A_DefaultGui</strong></a> 包含默认 GUI 的名称或数字.</p>

<h2 id="ControlOptions">控件的选项(Gui Add)</h2>
<h3 id="PosSize">控件的位置和大小</h3>
<p class="note"><strong>注意:</strong> 虽然本节中描述的选项能适用于简单的布局, 但你可能会发现使用 Rajat 的 SmartGUI Creator 更容易, 因为它完全是可视化的, 即 "所见即所得". SmartGUI Creator 是免费的, 可以从 <a href="https://www.autohotkey.com/docs/SmartGUI/">www.autohotkey.com/docs/SmartGUI/</a> 下载.</p>
<p>如果在 <em>Options</em> 中省略了某些尺寸和/或坐标, 则会根据前一个控件确定它的位置, 根据控件的类型和内容确定它的大小.</p>
<p>支持下列选项:</p>
<p id="R"><strong>R</strong>: 指定文本的行数(可以为浮点数, 如 R2.5). 使用 <strong>R</strong> 通常比 <strong>H</strong>(高度) 更合适. 如果同时指定 <strong>R</strong> 和 <strong>H</strong> 选项, 则 <strong>R</strong> 优先考虑. 对于 GroupBox, 此选项设置在框中可以容纳的控件数目. 对于 <a href="GuiControls.htm#DropDownList">DropDownLists</a>, <a href="GuiControls.htm#ComboBox">ComboBoxes</a> 和 <a href="GuiControls.htm#ListBox">ListBoxes</a>, 此选项设置在控件的列表部分一次可以看到的项目数(但在 Windows XP 或更高版本中, 对于 DropDownList 和 ComboBox 控件常常同时省略 <strong>R</strong> 和 <strong>H</strong> 选项, 这样可以让弹出的列表自动设置为用户桌面的可用高度). 对于其他类型的控件, <strong>R</strong> 表示控件内可见的文本行数.</p>
<p><strong>W</strong>: 宽度, 单位为像素. 如果省略, 对于某些控件则根据其内容自动计算宽度. 其他类型的控件具有下列默认的宽度值;  选项卡控件默认为 30 倍的当前字体大小加上 3 倍的 <a href="#Margin">X-margin(行边距)</a>; 垂直进度条默认为 2 倍的当前字体大小; 而水平进度条, 水平滑动条, DropDownList, ComboBox, ListBox, GroupBox, Edit 和 Hotkey 默认为 15 倍的当前字体大小(GroupBox 例外, 其默认宽度为 18 倍, 这样可以显示内部的边距).</p>
<p><strong>H</strong>: 高度, 单位为像素. 如果 <strong>H</strong> 和 <strong>R</strong> 选项同时省略, 则 DropDownList, ComboBox, ListBox 和初始内容为空的多行 Edit 控件默认为 3 行; GroupBox 默认为 2 行; 垂直滑动条和进度条默认为 5 行; 水平滑动条默认为 30 像素(在没有指定其厚度时); 水平进度条默认为 2 倍的当前字体大小; Hotkey 控件默认为 1 行; 而 Tab 控件默认为 10 行. 对于其他类型的控件, 根据它们的内容自动计算高度. 请注意对于 DropDownList 和 ComboBox, <strong>H</strong> 为控件总是可见的部分(大概指列表上面的框) 和其列表部分相加的高度(但即使高度设置很小, 也至少会在下拉列表中显示一个项目). 同时对于所有类型的控件, 通过 <strong>R</strong> 选项指定行数比使用 <strong>H</strong> 更可取, 因为这样可以避免在控件中显示部分/不完整的文本行.</p>
<p><strong>wp+n</strong>, <strong>hp+n</strong>, <strong>wp-n</strong>, <strong>hp-n</strong>(其中 <strong>n</strong> 可以为任意数字) 用来设置控件的宽度和/或高度等于前一个添加控件的宽度或高度, 可以使用加号或减号进行调整. 例如, <code>wp</code> 将设置控件的宽度等于之前的控件, 而 <code>wp-50</code> 则设置宽度为之前的控件宽度减去 50 像素.</p>
<p id="XY"><strong>X</strong>, <strong>Y</strong>: X-坐标, Y-坐标. 例如, 指定 <code>x0 y0</code> 则把控件放置到窗口工作区的左上角, 窗口工作区是在标题栏和菜单栏(如果有) 下面的区域.</p>
<p id="PosPlus"><strong>x+n</strong>, <strong>y+n</strong> (其中 <strong>n</strong> 可以为任意数字): 可以包括一个可选的加号, 以相对于前一个添加的控件的右边缘或底边缘(分别) 定位一个控件. 例如, 指定 <code>Y+10</code> 将把控件放置在前一个控件底部下面 10 个像素的位置, 而不使用标准的填充间距. 同样地, 指定 <code>X+10</code> 将把控件放置在前一个控件右边缘的右边 10 个像素的位置. 由于负数如 <code>X-10</code> 表示绝对的位置, 因此要使用负的位置偏移, 需要在前面加上一个加号. 例如: <code>X+-10</code>.</p>
<p id="PosPlusMargin"><span class="ver">[v1.1.16+]:</span> 对于 <strong>X+</strong> 和 <strong>Y+</strong>, 可以用字母 <strong>M</strong> 来代替窗口的当前<a href="#Margin">边距</a>. 例如, <code>x+m</code> 使用前一个控件的右边缘位置加上标准填充间隔. <code>xp y+m</code> 将控件放置于前一个之下, 而单独指定一个相对的 X 坐标(使用 xp 或 x+), 相当于默认情况下隐式的 <code>yp</code>.</p>
<p id="xp"><strong>xp+n</strong>, <strong>yp+n</strong>, <strong>xp-n</strong>, <strong>yp-n</strong>(其中 <strong>n</strong> 可以为任意数字) 可以用来指定控件相对于前一个控件左上角的位置, 此选项常用于 <a href="GuiControls.htm#GroupBox">GroupBox</a> 中的封装控件.</p>
<p id="xm"><strong>xm</strong> 和 <strong>ym</strong> 可以用来将一个控件分别定位在窗口的最左边和最上面的<a href="#Margin">边缘</a>(它们后面也可以加上一个正/负号和一个数字).</p>
<p id="xs"><strong>xs</strong> 和 <strong>ys</strong>: 这与 <strong>xm</strong> 和 <strong>ym</strong> 类似, 只是它们是相对于前一个选项中带有 <a href="#Section">Section</a> 单词的控件所保存的坐标(窗口的第一个控件总是开始一个新列, 即使这个单词没有在其选项中指定). 例如:</p>
<pre>gui, add, edit, w600  <em>; 在窗口的顶部添加一个非常宽的编辑控件.</em>
gui, add, text, <strong>section</strong>, First Name:  <em>; 保存此控件位置并定义一个新控件段.</em>
gui, add, text,, Last Name:
gui, add, edit, <strong>ys</strong>  <em>; 在此控件段中开始一个新列.</em>
gui, add, edit
gui, show</pre>
<p><strong>xs</strong> 和 <strong>ys</strong> 后面可以跟着一个加号/减号和一个数字. 并且, 还可以在控件的选项中同时指定单词 <a href="#Section">Section</a> 和 xs/ys; 这样可以让当前控件使用之前的控件段, 但为后续控件定义一个新段.</p>
<p>省略 <strong>X</strong>, <strong>Y</strong> 或两者都是有用的, 可以使 GUI 布局自动调整, 以适应将来可能对控件大小或字体所做的任何更改. 相比之下, 为每个控件指定绝对位置可能需要手动移动正在放大或缩小的控件下面和/或右侧的所有控件的位置.</p>
<p>如果 <strong>X</strong> 和 <strong>Y</strong> 都被省略, 控件将使用标准填充距离(当前<a href="#Margin">边距</a>) 被放置在前一个控件的下面.</p>
<p>如果只省略了一个组件, 它的默认值取决于使用哪个选项来指定其他组件:</p>
<table class="info">
  <tr><th>指定了 X</th><th>Y 的默认值</th></tr>
  <tr><td>x<em>n</em> 或 xm</td><td>在所有之前控件的下方(最大 Y 范围加边距).</td></tr>
  <tr><td>xs</td><td>在最近一次使用 <a href="#Section">Section</a> 选项后的所有之前控件的下方.</td></tr>
  <tr><td>x+<em>n</em> 或 xp</td><td>等同于前一个控件的顶部边缘(<a href="#xp">yp</a>).</td></tr>
  <tr><th>指定了 Y</th><th>X 的默认值</th></tr>
  <tr><td>y<em>n</em> 或 ym</td><td>在所有之前控件的右边(最大 X 范围加边距).</td></tr>
  <tr><td>ys</td><td>自最近一次使用 <a href="#Section">Section</a> 选项以来, 所有先前控件的右边.</td></tr>
  <tr><td>y+<em>n</em> 或 yp</td><td>等同于前一个控件的左边缘(<a href="#xp">xp</a>).</td></tr>
</table>

<h3 id="Events">存储和响应用户的输入</h3>
<p id="var"><strong>V</strong>: 变量. 为控件分配关联变量. 在字母 V 后指定一个变量名, 此变量将为全局变量(或指向全局变量的 <a href="../Functions.htm#ByRef">ByRef 局部变量</a>, 在 <span class="ver">[v1.0.46.01+]</span> 还可能为<a href="../Functions.htm#static">静态变量</a>). 例如, 指定 <code><strong>v</strong>MyEdit</code> 后, 每当执行 <a href="#Submit">Gui Submit</a> 命令时将把控件的内容保存到变量 <em>MyEdit</em>. 如果控件是不可输入型(例如 Text 控件或 GroupBox), 那么为其分配的关联变量作为控件的唯一标识符仍可用于 <a href="GuiControl.htm">GuiControl</a>, <a href="GuiControlGet.htm">GuiControlGet</a> 和 <a href="../Variables.htm#GuiControl">A_GuiControl</a>.</p>
<p class="note"><strong>注意</strong>: <a href="#Submit">Gui Submit</a> 不会改变不可输入型控件(例如 Text 和 GroupBox) 关联变量的内容, 也不会改变其他某些控件的内容(例如 <a href="ListView.htm">ListView</a> 和 <a href="TreeView.htm">TreeView</a>).</p>
<p id="label"><strong>G</strong>: Gosub(g-标签). 当用户点击或改变控件内容时会自动运行的子程序. 在字母 G 后指定需要执行的<a href="../misc/Labels.htm">标签</a>名称. 可以指定 <code>gCancel</code> 来隐式执行 <a href="#Cancel">Gui Cancel</a>(但如果在脚本中存在名称为 "Cancel" 的标签, 则会执行此标签). 在子程序中可以引用下列内置变量: <a href="../Variables.htm#Gui">A_Gui</a>, <a href="../Variables.htm#GuiControl">A_GuiControl</a>, <a href="../Variables.htm#GuiEvent">A_GuiEvent</a>, <a href="../Variables.htm#EventInfo">A_EventInfo</a> 和 <a href="../Variables.htm#ThisLabel">A_ThisLabel</a>.</p>
<p><span class="ver">[v1.1.20+]:</span> 如果不是一个有效标签名称, 可以用函数名称替代. 或者, 可以用 <a href="GuiControl.htm#Functor">GuiControl</a> 命令为控件连接一个<a href="../objects/Functor.htm">函数对象</a>. 函数(用 <code>gCtrlEvent</code> 设置的函数名称为 CtrlEvent) 可以接受以下可选参数:</p>
<pre class="Syntax"><span class="func">CtrlEvent</span>(CtrlHwnd, GuiEvent, EventInfo, ErrLevel:="")</pre>
<p>这些参数的意义取决于控件的类型. 注意, 如果第四个参数声明时没有默认值, 那么只有提供四个参数的事件才会调用该函数.</p>

<h3 id="OtherOptions">控件: 常用样式和其他选项</h3>
<p class="note"><strong>注意</strong>: 选项前的符号省略时, 默认为加号, 例如 <code>Wrap</code> 等同于 <code>+Wrap</code>. 相反地, <code>-Wrap</code> 将去除自动换行属性.</p>
<p id="AltSubmit"><strong>AltSubmit</strong>: 使用备用的提交方法. 对于 DropDownList, ComboBox 和 ListBox 此选项会让 <a href="#Submit">Gui Submit</a> 命令保存选择项目的位置而不是其文本. 如果没有选择项目, 则对于 ComboBox 会保存其编辑区域的文本; 同样地, 对于 DropDownList 或 ListBox 则把它们的关联<a href="#var">输出变量</a>设置为空. 注意: AltSubmit 还会影响 <a href="GuiControlGet.htm">GuiControlGet</a> 获取这些控件内容时的行为.</p>
<p><strong>C</strong>: 文本颜色(对<a href="GuiControls.htm#Button">按钮</a>控件无效). 指定字母 C 后面紧跟着颜色名称(请参阅<a href="Progress.htm#colors">颜色图表</a>) 或 RGB 值(0x 前缀可以省略). 例如: <code>cRed</code>, <code>cFF2211</code>, <code>c0xFF2211</code>, <code>cDefault</code>.</p>
<p><strong>Choose</strong>: 在 <a href="../commands/GuiControls.htm#ComboBox">ComboBox</a>, <a href="../commands/GuiControls.htm#DateTime">DateTime</a>, <a href="../commands/GuiControls.htm#DropDownList">DropDownList</a>, <a href="../commands/GuiControls.htm#ListBox">ListBox</a> 或 <a href="../commands/GuiControls.htm#Tab">Tab</a> 控件中预选一个项目. 指定单词 <code>Choose</code> 后面紧跟着一个项目的编号. 例如: <code>Choose2</code></p>
<p><strong>Disabled</strong>: 让可输入型控件变为灰色禁用状态, 这样可以防止取得焦点或用户改变其内容. 以后可以使用 <a href="GuiControl.htm#Enable">GuiControl Enable</a> 来启用控件. 注意: 要让编辑控件为只读状态, 请指定 <code>ReadOnly</code> 选项代替. 并且, 还可以在单词 Disabled 后紧跟着 0 或 1 来表示控件的初始状态(0 为启用而 1 为禁用). 换句话说, <code>Disabled</code> 和 <code>Disabled%VarContainingOne%</code> 是一样的.</p>
<p><strong>Hidden</strong>: 让控件初始为隐藏状态. 以后可以使用 <a href="GuiControl.htm#Show">GuiControl Show</a> 来让它显示. 可以在单词 Hidden 后跟着 0 或 1 来表示初始状态(0 为可见而 1 为隐藏). 换句话说, <code>Hidden</code> 和 <code>Hidden%VarContainingOne%</code> 是一样的.</p>
<p><strong>Left</strong>: 在控件的可用宽度内左对齐控件的文本.</p>
<p><strong>Right</strong>: 在控件的可用宽度内右对齐控件的文本. 对于复选框和单选按钮, 此选项也同时把框放置在控件的右边而不是左边.</p>
<p><strong>Center</strong>: 在控件的可用宽度内居中对齐控件的文本.</p>
<p id="Section"><strong>Section</strong>: 定义一个新的控件段并保存当前控件的位置以便在之后创建含有 <em>xs</em> 和 <em>ys</em> 选项的控件时使用, 请参阅<a href="#xs">上文的描述</a>.</p>
<p id="Tabstop"><strong>Tabstop</strong>: 使用 <code>-Tabstop</code>(即负 Tabstop) 可以让用户按 <kbd>Tab</kbd> 导航时跳过输入型控件.</p>
<p id="Wrap"><strong>Wrap</strong>: 让控件的文本自动换行. 因为几乎所有类型的控件初始状态都启用了自动换行, 所以需要通过 <code>-Wrap</code> 禁用它.</p>
<p><strong>VScroll</strong>: 当控件支持时为其提供一个垂直滚动条.</p>
<p><strong>HScroll</strong>: 当控件支持时为其提供一个水平滚动条. 这个段落的剩余部分仅适用于 <a href="GuiControls.htm#ListBox">ListBox</a>. 水平滚动的宽度默认为 ListBox 宽度的 3 倍. 要使用其他的滚动宽度, 请在单词 HScroll 后紧跟着一个数字表示. 例如, <code>HScroll500</code> 将在 ListBox 中使用 500 像素的滚动栏宽度. 但是, 如果指定的滚动宽度小于 ListBox 的宽度, 则不显示滚动条(不过在这种含有 <em>HScroll</em> 的情况下, 可以在之后使用 <code><a href="GuiControl.htm">GuiControl</a>, +HScroll500, MyScrollBar</code> 来添加水平滚动条, 否则是无法添加的).</p>

<h3 id="Controls_Uncommon_Styles_and_Options">控件: 不常用样式和选项</h3>
<p id="BackgroundTrans"><strong>BackgroundTrans</strong>: 使用透明的背景, 这样可以让任何一个在 Text, Picture 或 GroupBox 后面的控件显示出来. 例如, 在 Picture 控件上显示一个透明背景的 Text 可以让文字看起来就像图片的一部分. 以后可以使用 <code><a href="GuiControl.htm">GuiControl</a> +background</code> 移除此选项. 请参阅 <a href="GuiControls.htm#PicAltSubmit">Picture 控件的 AltSubmit 部分</a>来了解关于透明图像的更多细节. 已知限制: 对包含了 <a href="GuiControls.htm#Tab">ListView</a> 的 <a href="ListView.htm">Tab 控件</a>中的其他控件, BackgroundTrans 可能无法正确应用.</p>
<p><strong>-Background</strong>(即负 Background): 使用标准的背景颜色代替 <a href="#Color">Gui Color</a> 命令设置的那个颜色. 此选项常用于让 Tab 控件使用其标准颜色代替窗口颜色. 以后可以使用 <code><a href="GuiControl.htm">GuiControl</a> +background</code> 移除此选项.</p>
<p><strong>Border</strong>: 为控件增加一个细边框. 对于大多数控件不需要使用此选项, 因为它们已经含有特定于类型的边框. 添加一个边框到 <em>现有</em> 控件时, 可能需要给控件的宽度和高度增加 1 个像素.</p>
<p id="HwndOutputVar"><strong>Hwnd</strong><em>OutputVar</em> <span class="ver">[v1.0.46.01+]:</span> 在 <a href="#Add">Gui Add</a> 中使用时, 此选项保存新建控件的窗口句柄(HWND) 到 <em>OutputVar</em>. 例如: <code>Gui, Add, Edit, vMyEdit HwndMyEditHwnd</code>. 如果在函数中使用, <em>MyEditHwnd</em> 会被视为<a href="../Functions.htm#DynVar">函数动态变量</a>. 控件的 HWND 常用于 <a href="PostMessage.htm">PostMessage</a>, <a href="PostMessage.htm">SendMessage</a> 和 <a href="DllCall.htm">DllCall()</a>. 它还可以直接用在 <a href="../misc/WinTitle.htm#ahk_id">ahk_id WinTitle</a>(即使 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置关闭时, 这样对于隐藏控件也是有效的) 或在 <span class="ver">[ v1.1.04+]</span> 中 GuiControl 和 GuiControlGet 的<em>ControlID</em> 参数. 相关提示, 父窗口的 HWND 可以使用 <a href="#GuiHwndOutputVar">Gui MyGui:+HwndOutputVar</a> 获取.</p>
<p><strong>Theme</strong>: 使用此选项可以让新建的控件忽略窗口当前的主题设置. 它对于现有控件没有效果; 不过, 这种情况可能在将来的版本中改变. 请参阅 <a href="#Theme">Gui +/-Theme</a> 了解详情.</p>
<p><strong>(未命名样式)</strong>: 在十进制或十六进制的<a href="../misc/Styles.htm">样式编号</a>前加上加号或减号表示添加或删除此样式. 如果省略了符号, 则默认为加号.</p>
<p><strong>(未命名扩展样式)</strong>: 在字母 E 和十进制或十六进制的扩展样式编号前加上加号或减号表示添加或删除此扩展样式. 如果省略了符号, 则默认为加号. 例如, <code>E0x0200</code> 表示添加 WS_EX_CLIENTEDGE 样式, 它可以为图片和其他控件增加一个下沉的边框样式. 尽管这里没有列出其他的扩展样式编号(因为它们极少使用), 不过可以通过在 <a href="https://www.microsoft.com">www.microsoft.com</a> 中搜索 WS_EX_CLIENTEDGE 找到它们.</p>

<h2 id="Labels">窗口事件</h2>
<p>如果在脚本中存在下列的标签(子程序) 时, 它们会自动和 GUI 窗口关联:</p>
<ul>
  <li><a href="#GuiClose">GuiClose</a></li>
  <li><a href="#GuiEscape">GuiEscape</a></li>
  <li><a href="#GuiSize">GuiSize</a></li>
  <li><a href="#GuiContextMenu">GuiContextMenu</a></li>
  <li><a href="#GuiDropFiles">GuiDropFiles</a></li>
</ul>
<p><span class="ver">[v1.1.20+]:</span> 如果事件处理标签不存在, 那么相同名称的函数将替代标签响应. 函数可选择接收 GUI 的 <a href="#GuiHwndOutputVar">HWND</a> 作为第一个参数. 一些事件还有更多的参数.</p>
<p>对于非第一个窗口<a href="#MultiWin">(多窗口的情况) </a>, 窗口的名称或序号(如果有) 会被作为前面提到的特殊标签的前缀; 例如, 2GuiEscape 和 2GuiClose 将被作为第二窗口的默认标签, 当 <em>MyGui</em>GuiEscape 和 <em>MyGui</em>GuiClose 会作为 <em>MyGui</em> 的默认标签. 要自定义一个前缀, 请用 <a href="#PlusLabel">Gui +Label</a>.</p>

<h3 id="GuiClose">GuiClose</h3>
<p>使用下列其中一种方法关闭窗口时自动运行此子程序: 点击标题栏上的关闭按钮, 从标题栏中的系统菜单中选择 "关闭" 或使用 <a href="WinClose.htm">WinClose</a> 关闭. 如果此标签不存在, 则关闭窗口只是简单地隐藏窗口, 与 <a href="#Cancel">Gui Cancel</a> 的效果一样. 在 GuiClose 中一个最常用的动作是 <a href="ExitApp.htm">ExitApp</a>; 例如:</p>
<pre>GuiClose:
ExitApp</pre>
<p><span class="ver">[v1.1.20+]:</span> 如果 GuiClose 是一个函数, GUI 默认将隐藏. 函数可以通过返回一个非零整数来防止这种情况, 如下面的例子:</p>
<pre>GuiClose(GuiHwnd) {  <em>; 这个参数声明是可选的.</em>
    MsgBox 4,, Are you sure you want to hide the GUI?
    IfMsgBox No
        return true  <em>; true = 1</em>
}</pre>

<h3 id="GuiEscape">GuiEscape</h3>
<p>用户在 GUI 窗口活动时按下 <kbd>Esc</kbd> 后自动运行此子程序. 如果此标签不存在, 则按下 <kbd>Esc</kbd> 没有效果.
已知限制: 如果窗口中首个控件是禁用的(可能与控件类型有关), 则按下  <kbd>Esc</kbd> 时 GuiEscape 子程序不会运行. 产生这样的效果可能是受其他一些事件的影响.</p>

<h3 id="GuiSize">GuiSize</h3>
<p>对窗口调整大小, 最小化, 最大化或还原时自动运行此子程序. 内置变量 <a href="../Variables.htm#GuiWidth">A_GuiWidth</a> 和 <a href="../Variables.htm#GuiWidth">A_GuiHeight</a> 分别包含了窗口工作区调整后的宽度和高度, 窗口工作区不包括标题栏, 菜单栏和边框. 此外, <a href="../Variables.htm#EventInfo">A_EventInfo</a> 和 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 将同时包含下列数字的其中一个:</p>
<ul>
  <li>0 = 窗口被还原, 或正常的通过拖拉窗口边缘调节了大小.</li>
  <li>1 = 窗口被最小化.</li>
  <li>2 = 窗口被最大化.</li>
</ul>
<p>脚本中可以使用 GuiSize 调整控件的大小和位置来响应用户对窗口大小的改变. 通过 <a href="https://www.autohotkey.com/boards/viewtopic.php?f=6&t=1079">AutoXYWH() by tmplinshi and toralf</a> 可以让这种处理更容易些.</p>
<p>当窗口改变大小时(脚本发出的事件), GuiSize 不一定会立即响应. 类似其他窗口事件, 如果当前线程为<a href="Thread.htm#Interrupt">不可中断的</a>, GuiSize 直到线程变为可中断之前都不会响应. 如果脚本正在改变窗口大小, 下面的例子将确保 GuiSize 立即响应:</p>
<pre><a href="Critical.htm#Off">Critical</a> Off  <em>; 无论是否设置过 Critical On.</em>
<a href="Sleep.htm">Sleep</a> -1</pre>
<p><span class="ver">[v1.1.22.05+]:</span> <a href="#Show">Gui Show</a> 会自动延迟一秒 <code>Sleep -1</code>, 所以通常无需再次使用 Sleep .</p>
<p><span class="ver">[v1.1.20+]:</span> 如果 GuiSize 为函数, 它的参数应为:</p>
<pre class="Syntax"><span class="func">GuiSize</span>(GuiHwnd, EventInfo, Width, Height)</pre>

<h3 id="GuiContextMenu">GuiContextMenu</h3>
<p>当用户在窗口上除标题栏和菜单栏外的其他地方点击右键时自动运行此子程序. 当用户按下 <kbd>Menu</kbd> 或 <kbd>Shift</kbd>+<kbd>F10</kbd> 时也会运行. 和其他多数 GUI 标签不同, GuiContextMenu 可以含有多个并发<a href="../misc/Threads.htm">线程</a>. 在 GuiContextMenu 子程序中可以引用下列内置变量:</p>
<ol>
  <li><a href="../Variables.htm#GuiControl">A_GuiControl</a>, 它包含了接收事件的控件的<a href="../Variables.htm#GuiControl">文本或变量名</a>(如果没有则为空).</li>
  <li><a href="../Variables.htm#EventInfo">A_EventInfo</a>: 当右键点击 ListBox, ListView 或 TreeView 时(可以由上面的 A_GuiControl 确定), A_EventInfo 包含了右键点击的控件项目:
    <ul>
      <li><a href="GuiControls.htm#ListBox">ListBox</a> 或 <a href="ListView.htm">ListView</a>: A_EventInfo 包含了当前焦点行的行号(如果没有则为 0).</li>
      <li><a href="TreeView.htm">TreeView</a>: 右键点击时, A_EventInfo 包含了右击项目的 ID 编号(如果用户点击到项目外的其他地方则为 0). 对于 <kbd>Menu</kbd> 和 <kbd>Shift</kbd>+<kbd>F10</kbd>, A_EventInfo 包含了选择的项目的 ID 编号.</li>
    </ul></li>
  <li>A_GuiX 和 A_GuiY, 包含了菜单显示位置的 X 和 Y  坐标(例如 <code><a href="Menu.htm">Menu</a>, MyContext, Show, %A_GuiX%, %A_GuiY%</code>). 这里的坐标相对于窗口的左上角.</li>
  <li>A_GuiEvent, 当用户右键点击时包含单词 RightClick, 当用户按下 <kbd>Menu</kbd> 或 <kbd>Shift</kbd>+<kbd>F10</kbd> 时包含单词 Normal.</li>
</ol>
<p class="note"><strong>注意</strong>: 由于 <a href="GuiControls.htm#Edit">Edit</a> 和 <a href="GuiControls.htm#MonthCal">MonthCal</a> 控件有它们自己的右键菜单, 所以右键点击这些控件时不会运行 GuiContextMenu.</p>
<p><span class="ver">[v1.1.20+]:</span> 如果 GuiContextMenu 为函数, 它的参数应为:</p>
<pre class="Syntax"><span class="func">GuiContextMenu</span>(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y)</pre>
<p><em>CtrlHwnd</em> 如果控件没有接收到事件则为空. <em>IsRightClick</em> 在 A_GuiEvent 为 RightClick 时返回 True.</p>

<h3 id="GuiDropFiles">GuiDropFiles</h3>
<p>拖放文件/文件夹到窗口上时运行此子程序(如果此子程序已经在运行中, 则忽略拖放事件). 在 GuiDropFiles 中可以引用下列内置变量:</p>
<ol>
  <li><a href="../Variables.htm#GuiControl">A_GuiControl</a>, 它包含了接收到释放文件的控件的<a href="../Variables.htm#GuiControl">文本或变量名</a>(如果没有则为空).</li>
  <li><a href="../Variables.htm#EventInfo">A_EventInfo</a> 和 <a href="../misc/ErrorLevel.htm">ErrorLevel</a>, 包含了释放文件的数目.</li>
  <li>A_GuiX 和 A_GuiY, 包含了释放文件时的 X 和 Y 坐标(相对于窗口的左上角).</li>
  <li>A_GuiEvent, 包含了被释放文件的名称, 文件名之间使用换行符(`n) 分隔.</li>
</ol>
<p>要逐个提取每个文件, 请使用<a href="LoopParse.htm">解析循环</a>, 如下所示:
</p>
<pre><em>; 示例 #1:</em>
Loop, Parse, A_GuiEvent, `n
{
    MsgBox, 4,, File number %A_Index% is:`n%A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}

<em>; 示例 #2: 只要提取首个文件, 请参照此例:</em>
Loop, Parse, A_GuiEvent, `n
{
    FirstFile = %A_LoopField%
    break
}

<em>; 示例 #3: 要按照文件名的字母顺序处理文件, 请参照此例:</em>
FileList := A_GuiEvent
Sort, FileList
Loop, Parse, FileList, `n
    MsgBox File number %A_Index% is:`n%A_LoopField%.</pre>
<p>要临时禁用窗口的拖放功能, 请使用 <code>Gui -E0x10</code> 移除 WS_EX_ACCEPTFILES 样式. 后面要重新启用, 请使用 <code>Gui +E0x10</code>.</p>
<p><span class="ver">[v1.1.20+]:</span> 如果 GuiDropFiles 为函数, 它的参数应为下面例子中那样. <em>CtrlHwnd</em> 当文件在 GUI 上释放时为空. <em>FileArray</em> 为一个包含文件名称的<a href="../Objects.htm#Usage_Simple_Arrays">数组(对象)</a>, 其中 <code>FileArray[1]</code> 为第一个文件, 而 <code>FileArray.MaxIndex()</code> 返回文件的数量. 使用 <a href="For.htm">for-循环</a>可迭代枚举其中的文件:</p>
<pre>GuiDropFiles(GuiHwnd, FileArray, CtrlHwnd, X, Y) {
    for i, file in FileArray
        MsgBox File %i% is:`n%file%
}
</pre>

<h3 id="OtherEvents">其他事件</h3>
<p>其他 GUI 事件可以使用 <a href="OnMessage.htm">OnMessage()</a> 来检测和响应. 例如, 当用户把鼠标移动到窗口中特殊的控件时脚本可以通过工具提示显示相关帮助. 请参阅演示 <a href="#ExToolTip">GUI 工具提示示例</a>.</p>

<h2 id="MultiWin">创建多个 GUI 窗口</h2>
<p>要对非<a href="#DefaultWin">默认</a>窗口进行操作, 需要在子命令前加上窗口名称或编号(在 <span class="ver">[v1.1.03+]</span> 中, 还可以使用 <a href="#GuiHwndOutputVar">HWND</a>) 和一个冒号, 例如:</p>
<pre>Gui, <strong>MyGui:</strong>Add, Text,, Text for about-box.
Gui, <strong>MyGui:</strong>Show</pre>
<p>使用 <code><a href="#Default">Gui MyGui:Default</a></code> 后可以去除上面使用的 "MyGui:" 前缀. 此外, 在由窗口运行的 <a href="#DefaultWin">GUI 线程</a>中对此窗口进行操作时可以不加前缀.</p>
<p id="Name"><span class="ver">[v1.1.03+]:</span> Gui 名称必须遵循和<a href="../Concepts.htm#names">变量名</a>相同的规则. 在 1 到 99 范围外或长于两个字符(例如 0x01) 的数字必须为现有 Gui 的 HWND, 否则命令执行失败. 可以创建的窗口数仅受系统可用资源的限制.</p>
<p><span class="ver">[v1.1.04+]:</span> 使用 <a href="#New">Gui, New</a> 可以创建任何数目的未命名 GUI 窗口.</p>

<h2 id="DefaultWin">GUI 事件, 线程和子程序</h2>
<p>一个 GUI <a href="../misc/Threads.htm">线程</a>是由 GUI 动作启动的. GUI 动作包括从 GUI 窗口的<a href="#Menu">菜单栏</a>中选择一个项目或触发其某个 <a href="#label">g-标签</a>(例如按下按钮).</p>
<p>GUI 线程的<strong>默认<a href="#MultiWin">窗口名称</a></strong>是运行此线程的窗口名称. 非 GUI 线程的默认窗口编号为 1.</p>
<p>当一个 GUI <a href="../misc/Threads.htm">线程</a>启动时, 此线程的<a href="../misc/WinTitle.htm#LastFoundWindow">上次找到的窗口</a>初始为此 GUI 窗口自身. 这样可以让窗口和控件操作命令(例如 <a href="WinMove.htm">WinMove</a>, <a href="WinHide.htm">WinHide</a>, <a href="WinSet.htm">WinSet</a>, <a href="WinSetTitle.htm">WinSetTitle</a> 和 <a href="ControlGetFocus.htm">ControlGetFocus</a>) 对当前的 GUI 窗口进行操作时省略 WinTitle 和 WinText(即使窗口处于隐藏状态).</p>
<p>当一个控件的 <a href="#label">g-标签</a>由于之前的点击还在运行时, 点击此控件不会有效果并且此事件被丢弃. 要避免此问题, 请在子程序的首行使用 <a href="Critical.htm">Critical</a>(不过, 这样也将缓冲/延迟其他<a href="../misc/Threads.htm">线程</a>, 例如按下的热键).</p>
<p>内置变量 A_Gui 和 A_GuiControl 包含了运行当前线程的窗口编号和控件 ID. 要了解详情请参阅 <a href="../Variables.htm#Gui">A_Gui</a> 和 <a href="../Variables.htm#GuiControl">A_GuiControl</a>.</p>
<p>要让多个事件执行相同的子程序, 请在子程序上面连续指定这些标签. 例如:</p>
<pre>GuiEscape:
GuiClose:
ButtonCancel:
ExitApp  <em>; 上面的所有标签都会执行这个语句.</em></pre>
<p>所有的 GUI <a href="../misc/Threads.htm">线程</a>都会以设置的默认值启动, 例如 <a href="SendMode.htm">SendMode</a>. 这些默认值可以在<a href="../Scripts.htm#auto">自动执行段</a>改变.</p>

<h2 id="Navigate">键盘导航</h2>
<p>使用  <kbd>Tab</kbd> 可以在 GUI 窗口中导航, 它会移动键盘焦点到下一个可输入型控件中(跳过移除了 <a href="#Tabstop">Tabstop</a> 样式的控件). 导航的顺序由控件添加的顺序决定. 当首次显示一个窗口时, 键盘焦点将在首个具有 Tabstop 样式(默认情况下大多数类型的控件都具有) 的可输入型控件上.</p>
<p id="ShortcutKey">可以在某些控件的名称中包含和符号(&amp;) 来创建此控件的键盘快捷键, 在控件名称中的快捷键字母会加上下划线显示(取决于系统设置). 用户可以通过按下 <kbd>Alt</kbd> 和相应的字符来触发这样的快捷键. 对于按钮, 复选框和单选按钮, 按下相应的快捷键等于点击了按钮. 对于 GroupBox 和 Text 控件, 按下相应的快捷键则移动键盘焦点到此控件后(不是指位置, 是创建顺序) 首个具有 <a href="#Tabstop">tabstop</a> 样式的可输入型控件中. 然而, 如果多个控件含有相同的快捷键, 则按下此快捷键会让键盘焦点在这些控件中交替.</p>
<p>要在上面提及类型的控件中显示一个原义的和符号, 请指定两个连续的和符号, 例如: <code>Gui, Add, Button,, Save &amp;&amp; Exit</code>.</p>

<h2 id="Appear">窗口外观</h2>
<p>GUI 窗口使用托盘图标作为其窗口图标是在窗口创建时生效. 因此, 如果要使用不同的图标, 需要在创建窗口前改变托盘图标. 例如: <code><a href="Menu.htm">Menu</a>, Tray, Icon, MyIcon.ico</code>. 还可以让窗口拥有一个不同的大图标而不用这个小图标(大图标显示在 alt-tab 任务切换器中). 这个功能可以通过 <a href="LoadPicture.htm">LoadPicture()</a> 和 <a href="PostMessage.htm">SendMessage</a> 来实现; 例如:</p>
<pre>iconsize := 32  <em>; alt-tab 任务切换器中图标的理想尺寸在不同版本的系统中有所不同.</em>
hIcon := LoadPicture("My Icon.ico", "Icon1 w" iconsize " h" iconsize, imgtype)
Gui +LastFound
SendMessage 0x0080, 1, hIcon  <em>; 0x0080 是 WM_SETICON; 1 表示 ICON_BIG(而 0 表示 ICON_SMALL).</em>
Gui Show</pre>
<p>旧版使用 DllCall 的例子留做记录, 不推荐.</p>
<pre>hIcon := DllCall("LoadImage", uint, 0
    , str, "My Icon.ico"  <em>; 图标文件名(此文件可以包含多种尺寸的图标).</em>
    , uint, 1  <em>; 图像类型: IMAGE_ICON</em>
    , int, 32, int, 32  <em>; 想要的高度和宽度(可以让 LoadImage 确定哪个是最佳图标).</em>
    , uint, 0x10)  <em>; Flags: LR_LOADFROMFILE</em>
Gui +LastFound
<a href="PostMessage.htm">SendMessage</a>, 0x0080, 1, hIcon
</pre>
<p>由于操作系统的限制, 在 Windows XP 以及更高版本中, Checkbox, Radio 和 GroupBox 控件中的文本不是使用默认颜色时将显示为经典主题外观.</p>
<p>相关主题: <a href="#Margin(边距)">窗口边距</a>.</p>

<h2 id="GenRemarks">一般说明</h2>
<p>使用 <a href="GuiControl.htm">GuiControl</a> 和 <a href="GuiControlGet.htm">GuiControlGet</a> 可以单独对 GUI 窗口中的控件进行操作.</p>
<p>每个 GUI 窗口最多可以包含 11,000 个控件. 然而, 当控件数量超过 5000 时需要谨慎, 因为此时某些类型的控件可能让系统不稳定.</p>
<p>使用 GUI 命令的任何脚本会自动成为<a href="_Persistent.htm">持续运行的</a>(即使 GUI 命令实际从未执行过). 同时也会单实例运行, 除非使用 <a href="_SingleInstance.htm">#SingleInstance</a> 覆盖了默认设置.</p>

<h2 id="Related">相关</h2>
<p><a href="GuiControl.htm">GuiControl</a>, <a href="GuiControlGet.htm">GuiControlGet</a>, <a href="Menu.htm">Menu</a>, <a href="GuiControls.htm">控件类型</a>, <a href="ListView.htm">ListView</a>, <a href="TreeView.htm">TreeView</a>, <a href="Control.htm">Control</a>, <a href="ControlGet.htm">ControlGet</a>, <a href="Progress.htm">SplashImage</a>, <a href="MsgBox.htm">MsgBox</a>, <a href="FileSelectFile.htm">FileSelectFile</a>, <a href="FileSelectFolder.htm">FileSelectFolder</a></p>

<h2 id="Examples">示例</h2>

<div class="ex" id="ExPopup">
<p><a class="ex_number" href="#ExPopup"></a> 创建一个弹出窗口, 实现类似 <a href="SplashTextOn.htm">SplashTextOn</a> 的效果.</p>
<pre>Gui, +AlwaysOnTop +Disabled -SysMenu +Owner  <em>; +Owner 避免显示任务栏按钮.</em>
Gui, Add, Text,, Some text to display.
Gui, Show, NoActivate, Title of Window  <em>; NoActivate 让当前活动窗口继续保持活动状态.</em></pre>
</div>

<div class="ex" id="ExInputBox">
<p><a class="ex_number" href="#ExInputBox"></a> 创建一个要求输入姓名的简单输入框.</p>
<pre>Gui, Add, Text,, First name:
Gui, Add, Text,, Last name:
Gui, Add, Edit, vFirstName ym  <em>; ym 选项开始一个新的控件列.</em>
Gui, Add, Edit, vLastName
Gui, Add, Button, default, OK  <em>; ButtonOK(如果存在) 会在此按钮被按下时运行.</em>
Gui, Show,, Simple Input Example
return  <em>; 自动运行段结束. 在用户进行操作前脚本会一直保持空闲状态.</em>

GuiClose:
ButtonOK:
Gui, Submit  <em>; 保存用户的输入到每个控件的关联变量中.</em>
MsgBox You entered "%FirstName% %LastName%".
ExitApp</pre>
</div>

<div class="ex" id="ExTab">
<p><a class="ex_number" href="#ExPopup"></a> 创建带有多个选项卡的选项卡控件, 每个选项卡包含不同的控件与之交互.</p>
<pre>Gui, Add, Tab2,, First Tab|Second Tab|Third Tab  <em>; Tab2 比起 Tab 需要 <span class="ver">[v1.0.47.05+]</span>.</em>
Gui, Add, Checkbox, vMyCheckbox, Sample checkbox
Gui, Tab, 2
Gui, Add, Radio, vMyRadio, Sample radio1
Gui, Add, Radio,, Sample radio2
Gui, Tab, 3
Gui, Add, Edit, vMyEdit r5  <em>; r5 表示 5 行的高度.</em>
Gui, Tab  <em>; 即后续添加的控件将不属于前面那个选项卡控件.</em>
Gui, Add, Button, default xm, OK  <em>; xm 把它放置在左下角.</em>
Gui, Show
return

ButtonOK:
GuiClose:
GuiEscape:
Gui, Submit  <em>; 保存每个控件的内容到其关联变量中.</em>
MsgBox You entered:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
ExitApp</pre>
</div>

<div class="ex" id="ExListBox">
<p><a class="ex_number" href="#ExInputBox"></a> 显示一个目录中的文件的列表框.</p>
<pre>Gui, Add, Text,, Pick a file to launch from the list below.`nTo cancel, press ESCAPE or close this window.
Gui, Add, ListBox, vMyListBox gMyListBox w640 r10
Gui, Add, Button, Default, OK
Loop, C:\*.*  <em>; 根据您的需要改变此文件和通配符模式.</em>
{
    GuiControl,, MyListBox, %A_LoopFileFullPath%
}
Gui, Show
return

MyListBox:
if (A_GuiEvent != "DoubleClick")
    return
<em>; 否则, 用户双击了列表中的项目, 所以把它和点击 OK 按钮进行相同的处理.
; 所以直接进入下一个标签.</em>
ButtonOK:
GuiControlGet, MyListBox  <em>; 获取列表框中当前选择的项目.</em>
MsgBox, 4,, Would you you like to launch the file or document below?`n`n%MyListBox%
IfMsgBox, No
    return
<em>; 否则, 运行此文件:</em>
Run, %MyListBox%,, UseErrorLevel
if (ErrorLevel = "ERROR")
    MsgBox Could not launch the specified file.  Perhaps it is not associated with anything.
return

GuiClose:
GuiEscape:
ExitApp</pre>
</div>

<div class="ex" id="ExToolTip">
<p><a class="ex_number" href="#ExToolTip"></a> 当鼠标移动到特定的控件上时显示相关帮助(使用工具提示).</p>
<pre>Gui, Add, Edit, v<strong>MyEdit</strong>
<strong>MyEdit</strong>_TT := "This is a tooltip for the control whose variable is MyEdit."
Gui, Add, DropDownList, v<strong>MyDDL</strong>, Red|Green|Blue
<strong>MyDDL</strong>_TT := "Choose a color from the drop-down list."
Gui, Add, Checkbox, vMyCheck, This control has no tooltip.
Gui, Show
<a href="OnMessage.htm">OnMessage</a>(0x0200, "WM_MOUSEMOVE")
return

WM_MOUSEMOVE()
{
    static CurrControl, PrevControl, _TT  <em>; _TT 保持为空以便用于下面的 ToolTip 命令.</em>
    CurrControl := A_GuiControl
    If (CurrControl != PrevControl and not InStr(CurrControl, " "))
    {
        ToolTip  <em>; 关闭之前的工具提示.</em>
        SetTimer, DisplayToolTip, 1000
        PrevControl := CurrControl
    }
    return

    DisplayToolTip:
    SetTimer, DisplayToolTip, Off
    <a href="ToolTip.htm">ToolTip</a> % %CurrControl%_TT  <em>; 前导的百分号表示要使用表达式.</em>
    SetTimer, RemoveToolTip, 3000
    return

    RemoveToolTip:
    SetTimer, RemoveToolTip, Off
    ToolTip
    return
}

GuiClose:
ExitApp</pre>
</div>

<div class="ex" id="OSD">
<p><a class="ex_number" href="#OSD"></a> 使用透明窗口进行屏幕显示(OSD).</p>
<pre>CustomColor := "EEAA99"  <em>; 可以为任意 RGB 颜色(在下面会被设置为透明).</em>
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow  <em>; +ToolWindow 避免显示任务栏按钮和 alt-tab 菜单项.</em>
Gui, Color, %CustomColor%
Gui, Font, s32  <em>; 设置大字体 (32 磅).</em>
Gui, Add, Text, vMyText cLime, XXXXX YYYYY  <em>; XX &amp; YY 用来自动调整窗口大小.
; 让此颜色的所有像素透明且让文本显示为半透明 (150):</em>
WinSet, TransColor, %CustomColor% 150
SetTimer, UpdateOSD, 200
Gosub, UpdateOSD  <em>; 立即进行第一次更新而不等待计时器.</em>
Gui, Show, x0 y400 NoActivate  <em>; NoActivate 让当前活动窗口继续保持活动状态.</em>
return

UpdateOSD:
MouseGetPos, MouseX, MouseY
GuiControl,, MyText, X%MouseX%, Y%MouseY%
return</pre>
</div>

<div class="ex" id="ExProgressBar">
<p><a class="ex_number" href="#OSD"></a> 创建一个在背景图像上移动的进度条.</p>
<pre>Gui, Color, White
Gui, Add, Picture, x0 y0 h350 w450, %A_WinDir%\system32\ntimage.gif
Gui, Add, Button, Default xp+20 yp+250, Start the Bar Moving
Gui, Add, Progress, vMyProgress w416
Gui, Add, Text, vMyText wp  <em>; wp 表示 "使用之前的宽度".</em>
Gui, Show
return

ButtonStartTheBarMoving:
Loop, %A_WinDir%\*.*
{
    if A_Index &gt; 100
        break
    GuiControl,, MyProgress, %A_Index%
    GuiControl,, MyText, %A_LoopFileName%
    Sleep 50
}
GuiControl,, MyText, Bar finished.
return

GuiClose:
ExitApp</pre>
</div>

<div class="ex" id="ExImageViewer">
<p><a class="ex_number" href="#ExImageViewer"></a> 创建一个简单的图像查看器.</p>
<pre>Gui, +Resize
Gui, Add, Button, default, &amp;Load New Image
Gui, Add, Radio, ym+5 x+10 vRadio checked, Load &amp;actual size
Gui, Add, Radio, ym+5 x+10, Load to &amp;fit screen
Gui, Add, Pic, xm vPic
Gui, Show
return

ButtonLoadNewImage:
FileSelectFile, file,,, Select an image:, Images (*.gif; *.jpg; *.bmp; *.png; *.tif; *.ico; *.cur; *.ani; *.exe; *.dll)
if not file
    return
Gui, Submit, NoHide <em>; 保存单选按钮的值.</em>
if (Radio = 1)  <em>; 按实际大小显示图像.</em>
{
    Width := 0
    Height := 0
}
else <em>; 选择了第二个单选按钮: 按照屏幕的大小显示图像.</em>
{
    Width := A_ScreenWidth - 28  <em>; 减去的 28 是用来显示边框和内边缘的空间.</em>
    Height := -1  <em>; "保持高宽比" 应该是最好的.</em>
}
GuiControl,, Pic, *w%width% *h%height% %file%  <em>; 载入图像.</em>
Gui, Show, xCenter y0 AutoSize, %file%  <em>; 调整窗口以适合图片尺寸.</em>
return

GuiClose:
ExitApp</pre>
</div>

<div class="ex" id="ExEditor">
<p><a class="ex_number" href="#ExEditor"></a> 创建一个带有菜单栏的简单文本编辑器.</p>
<pre><em>; 为菜单栏创建子菜单:</em>
Menu, FileMenu, Add, &amp;New, FileNew
Menu, FileMenu, Add, &amp;Open, FileOpen
Menu, FileMenu, Add, &amp;Save, FileSave
Menu, FileMenu, Add, Save &amp;As, FileSaveAs
Menu, FileMenu, Add  <em>; 分隔线.</em>
Menu, FileMenu, Add, E&amp;xit, FileExit
Menu, HelpMenu, Add, &amp;About, HelpAbout

<em>; 创建用来附加子菜单的菜单栏:</em>
Menu, MyMenuBar, Add, &amp;File, :FileMenu
Menu, MyMenuBar, Add, &amp;Help, :HelpMenu

<em>; 添加菜单栏到窗口:</em>
Gui, Menu, MyMenuBar

<em>; 创建主编辑控件并显示窗口:</em>
Gui, +Resize  <em>; 让用户可以调整窗口的大小.</em>
Gui, Add, Edit, vMainEdit WantTab W600 R20
Gui, Show,, Untitled
CurrentFileName :=""  <em>; 表示当前没有文件.</em>
return

FileNew:
GuiControl,, MainEdit  <em>; 清空编辑控件.</em>
return

FileOpen:
Gui +OwnDialogs  <em>; 强制用户响应 FileSelectFile 对话框后才能返回到主窗口.</em>
FileSelectFile, SelectedFileName, 3,, Open File, Text Documents (*.txt)
if not SelectedFileName   <em>; 没有选择文件.</em>
    return
Gosub FileRead
return

FileRead:  <em>; 调用者已经设置了 SelectedFileName 变量.</em>
FileRead, MainEdit, %SelectedFileName%  <em>; 读取文件的内容到变量中.</em>
if ErrorLevel
{
    MsgBox Could not open "%SelectedFileName%".
    return
}
GuiControl,, MainEdit, %MainEdit%  <em>; 在控件中显示文本.</em>
CurrentFileName := SelectedFileName
Gui, Show,, %CurrentFileName%   <em>; 在标题栏显示文件名.</em>
return

FileSave:
if not CurrentFileName   <em>; 还没有选择文件, 所以执行另存为操作.</em>
    Goto FileSaveAs
Gosub SaveCurrentFile
return

FileSaveAs:
Gui +OwnDialogs  <em>; 强制用户响应 FileSelectFile 对话框后才能返回到主窗口.</em>
FileSelectFile, SelectedFileName, S16,, Save File, Text Documents (*.txt)
if not SelectedFileName <em>; 没有选择文件.</em>
    return
CurrentFileName := SelectedFileName
Gosub SaveCurrentFile
return

SaveCurrentFile:  <em>; 调用者已经确保了 CurrentFileName 不为空.</em>
if FileExist(CurrentFileName)
{
    FileDelete %CurrentFileName%
    if ErrorLevel
    {
        MsgBox The attempt to overwrite "%CurrentFileName%" failed.
        return
    }
}
GuiControlGet, MainEdit  <em>; 获取编辑控件的内容.</em>
FileAppend, %MainEdit%, %CurrentFileName%  <em>; 保存内容到文件.
; 成功时在标题栏显示文件名 (以防 FileSaveAs 调用时的情况):</em>
Gui, Show,, %CurrentFileName%
return

HelpAbout:
Gui, About:+owner1  <em>; 让主窗口 (Gui #1) 成为 "关于对话框" 的父窗口.</em>
Gui +Disabled  <em>; 禁用主窗口.</em>
Gui, About:Add, Text,, Text for about box.
Gui, About:Add, Button, Default, OK
Gui, About:Show
return

AboutButtonOK:  <em>; 上面的 "关于对话框" 需要使用这部分.</em>
AboutGuiClose:
AboutGuiEscape:
Gui, 1:-Disabled  <em>; 重新启用主窗口 (必须在下一步之前进行).</em>
Gui Destroy  <em>; 销毁关于对话框.</em>
return

GuiDropFiles:  <em>; 对拖放提供支持.</em>
Loop, Parse, A_GuiEvent, `n
{
    SelectedFileName := A_LoopField  <em>; 仅获取首个文件 (如果有多个文件的时候).</em>
    break
}
Gosub FileRead
return

GuiSize:
if (ErrorLevel = 1)  <em>; 窗口被最小化了. 无需进行操作.</em>
    return
<em>; 否则, 窗口的大小被调整过或被最大化了. 调整编辑控件的大小以匹配窗口.</em>
NewWidth := A_GuiWidth - 20
NewHeight := A_GuiHeight - 20
GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight%
return

FileExit:     <em>; 用户在 File 菜单中选择了 "Exit".</em>
GuiClose:  <em>; 用户关闭了窗口.</em>
ExitApp</pre>
</div>

</body>
</html>